package rjl.linearlist.impl;

import rjl.linearlist.MyLinearList;

import java.lang.reflect.Array;

/**
 * Created by Administrator on 2017/3/2.
 */
public class ShuZuList<E> implements MyLinearList<E>{
//    定义一个数组
    private E[] data;
    //定义一个存储下标的变量
    private int Size;
//    定义一个存放数组长度的变量
    private int maxSize;
//    存储数组长度和定义Size值为0
    public ShuZuList(Class<E> type,int maxSize){
        data = (E[]) Array.newInstance(type,maxSize);
//        初始化Size
        Size = 0;
        this.maxSize = maxSize;
    }
    @Override
    /**
     * 在指定位置中插入一个元素
     */
    public void add(E e) {
        if (Size > data.length){
            throw new RuntimeException("超出数组最大值");
        }
        data[Size] = e;
        Size = Size+1;
    }

    /**
     * 在指定位置中插入元素
     * @param i 需要插入元素的位置
     * @param e 需要插入的元素
     */
    @Override
    public void insert(int i, E e) {
        if (Size > data.length || Size+1 > data.length){
            throw new RuntimeException("超出数组最大值");
        }
        for (int j = Size - 1;j >= i;j--){
            data[j+1] = data[j];
        }
        data[i] = e;

    }

    /**
     * 删除指定位置的元素
     * @param i 指定元素的位置
     */
    @Override
    public void delete(int i) {
        for(int j = i;j< Size;i++){
            data[i] = data[i+1];
        }
        Size = Size - 1;
    }

    /**
     * 显示指定元素的下标
     * @param e 指定的元素
     * @return 返回指定元素的下标如果没有则返回-1表示没有找到
     */
    @Override
    public int location(E e) {
        int a = 0;
        for (int j = 0 ;j <Size;j++){
            if (e.equals(data[j])){
                return a;
            }
            a++;
        }
        return -1;
    }

    /**
     * 获取指定位置的元素
     * @param i 指定的位置
     * @return 指定位置的元素
     */
    @Override
    public E take(int i) {
        return data[i];
    }

    /**
     * 更改指定位置的元素为另一个元素
     * @param i 指定的位置
     * @param e 新的元素
     */
    @Override
    public void update(int i, E e) {
        data[i] = e;
    }

    /**
     * 返回顺序表的长度
     * @return 返回长度
     */
    @Override
    public int getsize() {
        return Size-1;
    }

    /**
     * 清空顺序表
     */
    @Override
    public void clear() {
        for (int j = Size - 1;j >= 0;j--){
            data[j] = null;
        }
    }

    /**
     * 判断线性表是否为空
     * @return 返回true或者false
     */
    @Override
    public boolean isEmpt() {
        return Size==0;
    }
}
